package edu.pe.cayetano.model.bo;

import org.apache.commons.beanutils.DynaBean;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.dao.OperacionesComunesDAO;
import edu.pe.cayetano.dao.PacienteDAO;
import edu.pe.cayetano.framework.BusinessException;
import edu.pe.cayetano.framework.Configuration;
import edu.pe.cayetano.seccd.constantes.ConstantesMensajes;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;
import edu.pe.cayetano.util.Utilitario;

public class PacienteBO extends BaseBO{

	private	String		schema			= Configuration.getSchemaDB();
	
	
	/**
	 * Metodo que devuelve el query para recuperar pacientes
	 * */
	public StringBuffer estableceQuery(DynaBean dyna){
		StringBuffer 			query 			= new StringBuffer();
		String criterio		= null;
		if(Utilitario.validaAtributoDynaBean(dyna, "criterio"))
			criterio=(String)dyna.get("criterio");
		String campo		= (String)dyna.get("optCampo");
		String operacion	= (String)dyna.get("operacion");
		
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query.append(" SELECT PACIENTE_ID,NOMBRES,APEPATERNO,APEMATERNO,B.NOMBRE AS DISTRITO,DNI,FECHANACIMIENTO,TELEFONO_FIJO,TELEFONO_CELULAR,TIENE_HC "); 
				query.append(" FROM "+schema+"PACIENTE A INNER JOIN "+schema+"UBIGEO B ON A.COD_UBIGEO=B.COD_UBIGEO");
			}else{
				query.append(" SELECT PACIENTE_ID,NOMBRES,APEPATERNO,APEMATERNO,B.NOMBRE AS DISTRITO,DNI,FECHANACIMIENTO,TELEFONO_FIJO,TELEFONO_CELULAR,TIENE_HC "); 
				query.append(" FROM "+schema+"PACIENTE A INNER JOIN "+schema+"UBIGEO B ON A.COD_UBIGEO=B.COD_UBIGEO");
				query.append(" where upper("+campo.toUpperCase()+") like '%"+criterio.toUpperCase()+"%'"); 
			}

		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query.append(" SELECT PACIENTE_ID,NOMBRES,APEPATERNO,APEMATERNO,B.NOMBRE AS DISTRITO,DNI,FECHANACIMIENTO,TELEFONO_FIJO,TELEFONO_CELULAR,TIENE_HC "); 
			query.append(" FROM "+schema+"PACIENTE A INNER JOIN "+schema+"UBIGEO B ON A.COD_UBIGEO=B.COD_UBIGEO");
		}
		System.out.println("21:"+query.toString());
		return query;
	}
	
	/**
	 * Metodo que devuelve el query para recuperar pacientes
	 * */
	public StringBuffer estableceQuery(String operacion,String campo,String criterio){
		StringBuffer 			query 			= new StringBuffer();
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query.append(" SELECT PACIENTE_ID,NOMBRES,APEPATERNO,APEMATERNO,B.NOMBRE AS DISTRITO,DNI,FECHANACIMIENTO,TELEFONO_FIJO,TELEFONO_CELULAR,TIENE_HC "); 
				query.append(" FROM "+schema+"PACIENTE A INNER JOIN "+schema+"UBIGEO B ON A.COD_UBIGEO=B.COD_UBIGEO");
			}else{
				query.append(" SELECT PACIENTE_ID,NOMBRES,APEPATERNO,APEMATERNO,B.NOMBRE AS DISTRITO,DNI,FECHANACIMIENTO,TELEFONO_FIJO,TELEFONO_CELULAR,TIENE_HC "); 
				query.append(" FROM "+schema+"PACIENTE A INNER JOIN "+schema+"UBIGEO B ON A.COD_UBIGEO=B.COD_UBIGEO");
				query.append(" where upper("+campo.toUpperCase()+") like '%"+criterio.toUpperCase()+"%'"); 
			}
		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query.append(" SELECT PACIENTE_ID,NOMBRES,APEPATERNO,APEMATERNO,B.NOMBRE AS DISTRITO,DNI,FECHANACIMIENTO,TELEFONO_FIJO,TELEFONO_CELULAR,TIENE_HC "); 
			query.append(" FROM "+schema+"PACIENTE A INNER JOIN "+schema+"UBIGEO B ON A.COD_UBIGEO=B.COD_UBIGEO");
		}
		System.out.println("1:"+query.toString());
		return query;
	}
	
	
	/**
	 * Metodo que lista a los pacientes registrados en la base de datos del seccd
	 * */
	public BResult listarPaciente() throws BusinessException{
		BResult 				retSalida 		= new BResult();
		StringBuffer 			query 			= new StringBuffer(); 
		try{
			query = estableceQuery(ConstantesSECCD.OPERACION_LISTADO,"","");
			BResult 		retConn			= new BResult();
			retConn = conectar();
			if(retConn.getCode()==0 && retConn.getObject()!=null){
				OperacionesComunesDAO 		operacionesDAO	 	= new OperacionesComunesDAO(conn);
				retSalida 	= operacionesDAO.listado(query);
			}else{
				retSalida.setCode(retConn.getCode());
				retSalida.setMessage(ConstantesMensajes.ERROR_AMBIENTE);
			}
		}catch(Exception e){
			System.out.println("[SECCD][PacienteBO][listarPaciente]: error generado por:"+e.getMessage());
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[PacienteBO] error en metodo listarPaciente generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				System.out.println("[SECCD][PacienteBO][listarPaciente]: error generado por:"+e.getMessage());
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PacienteBO] error en metodo listarPaciente generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	/**
	 * Metodo que busca a los pacientes registrados en la base de datos del seccd
	 * */
	public BResult buscarPaciente(DynaBean dyna) throws BusinessException{
		BResult 			retSalida 		= new BResult();
		StringBuffer 		query 			= new StringBuffer(); 
		try{
			BResult 		retConn			= new BResult();
			retConn = conectar();
			if(retConn.getCode()==0 && retConn.getObject()!=null){
				OperacionesComunesDAO operacionesDAO	 	= new OperacionesComunesDAO(conn);
				query		 = estableceQuery(dyna);
				retSalida 	= operacionesDAO.listado(query);
			}else{
				retSalida.setCode(retConn.getCode());
				retSalida.setMessage(ConstantesMensajes.ERROR_AMBIENTE);
			}
		}catch(Exception e){
			System.out.println("[SECCD][PacienteBO][buscarPaciente]: error generado por:"+e.getMessage());
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[PacienteBO] error en metodo buscarPaciente generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				System.out.println("[SECCD][PacienteBO][buscarPaciente]: error generado por:"+e.getMessage());
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PacienteBO] error en metodo buscarPaciente generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * Metodo que carga los datos especificos de un paciente que se encuentran registrados en la base de datos del seccd
	 * */
	public BResult buscarPacienteEspecifico(DynaBean dyna) throws BusinessException{
		BResult 			retSalida 		= new BResult();
		try{
			BResult 		retConn			= new BResult();
			retConn = conectar();
			if(retConn.getCode()==0 && retConn.getObject()!=null){
				PacienteDAO 	pacienteDAO	 	= new PacienteDAO(conn);
				retSalida 	= pacienteDAO.buscarPacienteEspecifico(Utilitario.getPropertyDynaBean(dyna, "codigo"));
			}else{
				retSalida.setCode(retConn.getCode());
				retSalida.setMessage(ConstantesMensajes.ERROR_AMBIENTE);
			}
		}catch(Exception e){
			System.out.println("[SECCD][PacienteBO][buscarPacienteEspecifico]: error generado por:"+e.getMessage());
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[PacienteBO] error en metodo buscarPacienteEspecifico generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				System.out.println("[SECCD][PacienteBO][buscarPacienteEspecifico]: error generado por:"+e.getMessage());
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PacienteBO] error en metodo buscarPacienteEspecifico generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	/**
	 * Metodo que busca un paciente registrado en la bd del seccd y que es invocado desde la opcion de historia clinica
	 * */
	public BResult buscarPaciente_for_HC(DynaBean dyna) throws BusinessException{
		BResult 	retSalida 	= new BResult();
		try{
			BResult 		retConn			= new BResult();
			retConn = conectar();
			if(retConn.getCode()==0 && retConn.getObject()!=null){
				PacienteDAO		pacienteDAO	 	= new PacienteDAO(conn);
				retSalida 		= pacienteDAO.buscarPacientexHC(Utilitario.getPropertyDynaBean(dyna, "dni"));
			}else{
				retSalida.setCode(retConn.getCode());
				retSalida.setMessage(ConstantesMensajes.ERROR_AMBIENTE);
			}
		}catch(Exception e){
			System.out.println("[SECCD][PacienteBO][buscarPaciente_for_HC]: error generado por:"+e.getMessage());
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[PacienteBO] error en metodo buscarPaciente_for_HC generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				System.out.println("[SECCD][PacienteBO][buscarPaciente_for_HC]: error generado por:"+e.getMessage());
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PacienteBO] error en metodo buscarPaciente_for_HC generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * Metodo que busca un paciente registrado en la bd del seccd y que es invocado desde la opcion orden de servicio
	 * */
	public BResult buscarPacientexDNI(DynaBean dyna) throws BusinessException{
		BResult 	retSalida 	= new BResult();
		try{
			BResult 		retConn			= new BResult();
			retConn = conectar();
			if(retConn.getCode()==0 && retConn.getObject()!=null){
				PacienteDAO pacienteDAO	 	= new PacienteDAO(conn);
				retSalida 		= pacienteDAO.buscarPacientexDNI(Utilitario.getPropertyDynaBean(dyna,"dni"));
			}else{
				retSalida.setCode(retConn.getCode());
				retSalida.setMessage(ConstantesMensajes.ERROR_AMBIENTE);
			}
		}catch(Exception e){
			System.out.println("[SECCD][PacienteBO][buscarPacientexDNI]: error generado por:"+e.getMessage());
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[PacienteBO] error en metodo buscarPacientexDNI generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				System.out.println("[SECCD][PacienteBO][buscarPacientexDNI]: error generado por:"+e.getMessage());
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PacienteBO] error en metodo buscarPacientexDNI generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
}
